#include<iostream>
#include<assert.h>
#include<typeinfo>
#include<any>
// class Any
// {
//     public:

//     Any(){_holder=nullptr;}
//     Any(const Any& other):_holder(other._holder->clone()){}
//     template<class T>
//     Any(const T& val):_holder(new place_holder<T>(val)){}

//     Any& operator=(const Any& val )
//     {
//         Any(val).Swap(*this);
//         return *this;
//     }

//     template<class T>
//     Any& operator=(const T& val )
//     {
//         Any(val).Swap(*this);
//         return *this;
//     }

//     ~Any(){delete _holder;}

//     template<class T>
//     T* get()
//     {
//         assert(typeid(T)==_holder->type());
//         return &((place_holder<T>*)_holder)->_val;
//     }

//     private:

//     class holder
//     {
//         public:
//         virtual const std::type_info& type()=0;
//         virtual holder* clone()=0;
//     };

//     template<class T>
//     class place_holder:public holder
//     {
//         public:
//         virtual const std::type_info& type(){return typeid(T);}
//         virtual holder* clone(){return new place_holder<T>(_val);}
//         place_holder(const T& val):_val(val){}
//         T _val;
//     };

    

//     Any& Swap(Any& other)
//     {
//         std::swap(_holder,other._holder);
//         return *this;
//     }

//     private:
//     holder* _holder;
// };

// int main()
// {
//     Any pro;
//     pro=1;
//     int *p1=pro.get<int>();
//     std::cout<<*p1<<std::endl;
//     pro=std::string("hello world");
//     std::string* str=pro.get<std::string>();
//     std::cout<<*str<<std::endl;
//     return 0;
// }

int main()
{
    std::any test;
    test=std::string("hello world");
    std::string* str=std::any_cast<std::string>(&test);//这里需要取地址才能正常返回，返回值是个指针
    std::cout<<*str<<std::endl;
    return 0;
}